#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/2/7
# @Author: Sunny
# ========================

"""
多态:一类事务具有多种形态，一个抽象类(基类)有多个子类(因而多态的概念，依赖于继承),不同的子类对象调用相同的方法
    产生不同的执行结果，多态可以增加代码的灵活性

面向对象编程的三大特征：封装，继承，多态

在python中，其实不存在多态的说法，因为python函数参数传参，对类型没有限制
在python中叫伪多态

"""

#----------------------------python跟java函数传参的区别---------------------
# def func(name):
#     """
#     函数的参数，没有强制性的类型要求，可以为任意类型
#     :param name:
#     :return:
#     """
#     print(name)
#
#
# def func1(name: int):
#     """
#     其它语言，像java，参数需要指定参数类型,
#     在java里面，如果输入的参数不是int类型，会报错
#     :param name:
#     :return:
#     """
#     if not isinstance(name,int):
#         raise TypeError('{} not is str'.format(name))
#
#
# func(11)
# func('11')

#-------------------------------多态的理解--------------------------
class Base:
    def run(self):
        print('base的run方法：吃饭---')

class A(Base):
    def run(self):
        print('A的run方法：点外卖---')

class B(Base):
    def run(self):
        print('B的run方法：不吃东西---')

#此函数只能传Base类型，否则会报错
def func2(name: Base):
    """
    :param name:
    :return:
    """
    if not isinstance(name,Base):
        raise TypeError('{} not is Base'.format(name))

    #调用了Base类型对象的run方法
    name.run()

# ba = Base()
# #这里参数只能输base类型的，而且只能调用Base里面的run方法
# func2(ba)
#
# #通过父类和继承关系，可以实现多个形态，这称之为多态
# print('------------------')
# a = A()
# func2(a)
# print('------------------')
# b = B()
# func2(b)


Base().run()

